unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, 
  Controls, Forms, Dialogs, ExtCtrls, ColorGrd, Buttons, 
  Menus, StdCtrls;

type
  TMainForm = class(TForm)
    PaintArea: TImage;

    PanelTool: TPanel;

    buttLine: TSpeedButton;
    buttHand: TSpeedButton;
    buttRect: TSpeedButton;
    buttEllipse: TSpeedButton;
    buttText      : TSpeedButton;

    buttThickA: TSpeedButton;
    buttThickB: TSpeedButton;
    buttThickC: TSpeedButton;

    mMenu: TMainMenu;
    miFile: TMenuItem;
    miOpen: TMenuItem;
    miSave: TMenuItem;
    miExit: TMenuItem;
    miNew: TMenuItem;

    pnBkColor: TPanel;
    pnForeColor: TPanel;

    ColorPickup: TColorDialog;
    FontPickup  : TFontDialog;
    FilenameBox: TOpenDialog;
    SaveFileBox: TSaveDialog;

    procedure PaintAreaMouseDown(Sender: TObject;
                                                               Button: TMouseButton;
                                                              Shift: TShiftState; 
                                                              X, Y: Integer);
    procedure PaintAreaMouseMove(Sender: TObject; 
                                                               Shift: TShiftState; 
                                                               X,Y: Integer);
    procedure PaintAreaMouseUp(Sender: TObject; 
                                                           Button: TMouseButton;
                                                           Shift: TShiftState; 
                                                           X, Y: Integer);

    procedure FormCreate(Sender: TObject);

    procedure GetColorClick(Sender: TObject);
    procedure DrawTypeClick(Sender: TObject);
    procedure ThickOptionClick(Sender: TObject);
    procedure buttTextDblClick(Sender: TObject);

    procedure miOpenClick(Sender: TObject);
    procedure miSaveClick(Sender: TObject);
    procedure miNewClick(Sender: TObject);
    procedure miExitClick(Sender: TObject);

  private
    Pstart, Pend:TPoint;   
    drawKind        :Integer;  
    drawing          :Bool;     
    text                :String;   
    { Private declarations }

  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.DFM}

procedure TMainForm.PaintAreaMouseDown(Sender:TObject;
                                                                   Button: TMouseButton;
                                                                   Shift: TShiftState;
                                                                    X, Y: Integer);
var R:TRect;

begin
  Pstart:=Point(X,Y); Pend:=Point(X,Y);

  case drawKind of

    1:begin  
         PaintArea.Canvas.Pen.Mode:=pmNotXor;
         PaintArea.Canvas.MoveTo(pStart.X,pStart.Y);
         PaintArea.Canvas.LineTo(pEnd.X,pEnd.Y);
      end;

    2:begin 
         PaintArea.Canvas.MoveTo(pStart.X,pStart.Y);
         PaintArea.Canvas.LineTo(pEnd.X,pEnd.Y);
      end;

  3,4:begin 
        R:=Rect(Pstart.X,Pstart.Y,Pend.X,Pend.Y);
        PaintArea.Canvas.DrawFocusRect(R);
      end;

    5:begin   
        text:= InputBox('Input Text', 'Draw Text', '');
        if text<>'' then
            PaintArea.Canvas.TextOut(X,Y,Text)

      end;
  end;

   drawing:=True;
end;

{X ly tnh huong khi ngi dung di chuyen chuot tren vung ve PaintArea}
procedure TMainForm.PaintAreaMouseMove(Sender:TObject; 
                                                                   Shift:TShiftState; 
                                                                    X,Y: Integer);
var R:TRect;
begin
 if not drawing then exit;

 case drawKind of

   1: begin  
       PaintArea.Canvas.MoveTo(pStart.X,pStart.Y);
       PaintArea.Canvas.LineTo(pEnd.X,pEnd.Y);
       Pend:=Point(X,Y);
       PaintArea.Canvas.MoveTo(pStart.X,pStart.Y);
       PaintArea.Canvas.LineTo(pEnd.X,pEnd.Y);
      end;

   2: begin 
       Pend:=Point(X,Y);
       PaintArea.Canvas.LineTo(pEnd.X,pEnd.Y);
      end;

 3,4: begin
       R:=Rect(Pstart.X,Pstart.Y,Pend.X,Pend.Y);
       PaintArea.Canvas.DrawFocusRect(R);
       Pend:=Point(X,Y);
       R:=Rect(Pstart.X,Pstart.Y,Pend.X,Pend.Y);
       PaintArea.Canvas.DrawFocusRect(R);
      end;
 end;
end;

{X ly tnh huong khi ngi nha phm chuot tren vung ve PaintArea}
procedure TMainForm.PaintAreaMouseUp(Sender: TObject; 
                                                            Button: TMouseButton;
                                                            Shift: TShiftState; 
                                                             X, Y: Integer);
var R:TRect;

begin
 //Neu khong  trang thai ve th thoat
 if not drawing then exit;

 //Ngi dung nha chuot, thao tac ve a c xac nh
 case drawKind of

   1:begin   //Ve ng thang
      Pend:=Point(X,Y);
      PaintArea.Canvas.Pen.Mode:=pmCopy;
      PaintArea.Canvas.MoveTo(pStart.X,pStart.Y);
      PaintArea.Canvas.LineTo(pEnd.X,pEnd.Y);
     end;

   2:begin //Ve t do
      Pend:=Point(X,Y);
      PaintArea.Canvas.LineTo(pEnd.X,pEnd.Y);
     end;

 3,4:begin  //Ve hnh ch nhat va Ellipse
      //Xoa khung ch nhat nh v
      R:=Rect(Pstart.X,Pstart.Y,Pend.X,Pend.Y);
      PaintArea.Canvas.DrawFocusRect(R);
      //Ve ra Canvas hnh ch nhat hoac hnh ellipse
      case drawKind of
         3:PaintArea.Canvas.Rectangle(R);
         4:PaintArea.Canvas.Ellipse(R);
      end
     end;
 end;

 drawing:=false;
end;

{X ly tnh huong khi ngi dung kch chuot vao oi tng pnBkColor hoac pnForeColor yeu cau thay oi mau ve}
procedure TMainForm.GetColorClick(Sender: TObject);
begin

  //Hien th hop thoai chon mau
  if ColorPickup.Execute then begin
      //Cho biet mau sac a c cap nhat
     (sender as TPanel).Color:=ColorPickup.Color;

      //at lai mau to
      if Sender=pnBkColor then
         PaintArea.Canvas.Brush.Color:=ColorPickup.Color;

       //at lai mau cua but ve
      if Sender=pnForeColor then
         PaintArea.Canvas.Pen.Color:=ColorPickup.Color;
  end;
end;

{Phng thc x ly tnh huong kch chuot oi vi cac nut nhan the hien chc nang ve}
procedure TMainForm.DrawTypeClick(Sender: TObject);
begin
    if Sender=buttLine    then drawKind:=1;
  if Sender=buttHand    then drawKind:=2;
  if Sender=buttRect    then drawKind:=3;
  if Sender=buttEllipse then drawKind:=4;
  if Sender=buttText    then drawKind:=5;
end;

{Tnh huong khi tao Form}
procedure TMainForm.FormCreate(Sender: TObject);
begin
   PaintArea.Canvas.Pen.Color:=clBlack;
   PaintArea.Canvas.Brush.Color:=clYellow;
end;

{Khi ngi dung kch oi chuot vao nut nhan mang chc nang ve ch ta hien th hop thoai Font cho phep chon Font ch khac}
procedure TMainForm.buttTextDblClick(Sender: TObject);
begin

   if FontPickup.Execute then
      //Gan Font c chon cho canvas cua vung ve
      PaintArea.Canvas.Font:=FontPickup.Font;

end;

{Phng thc x ly tnh huong kch chuot cho nhom nut nhan the hien o day cua net ve}
procedure TMainForm.ThickOptionClick(Sender: TObject);
begin
 //Net mong
 if Sender=buttThickA then       
                 PaintArea.Canvas.Pen.Width:=1;
 //Net trung bnh
 if Sender=buttThickB then 
                 PaintArea.Canvas.Pen.Width:=5;
 //Net to
 if Sender=buttThickC then 
                 PaintArea.Canvas.Pen.Width:=10;
end;

{X ly muc chon New tren trnh n File}
procedure TMainForm.miNewClick(Sender: TObject);
begin
   //Xoa anh cu, tao anh mi
   PaintArea.Picture:=nil;
   PaintArea.Canvas.Pen.Color:=pnForeColor.Color;
   PaintArea.Canvas.Brush.Color:=pnBkColor.Color;
end;

{X ly muc chon Open tren trnh n File}
procedure TMainForm.miOpenClick(Sender: TObject);
begin
  //Hien th hop thoai m file
  if FilenameBox.Execute then
    //Nap anh vao vung ve PaintArea t a
    PaintArea.Picture.LoadFromFile(
                                         FilenameBox.FileName);
end;

{X ly muc chon Save tren trnh n File}
procedure TMainForm.miSaveClick(Sender: TObject);
begin
  //Hien th hop thoai lu file
  if SaveFileBox.Execute then
    //Lu noi dung anh cha trong PaintArea xuong a
    PaintArea.Picture.SaveToFile(SaveFileBox.FileName);

end;

{X ly muc chon Exit tren trnh n File}
procedure TMainForm.miExitClick(Sender: TObject);
begin
  Close;  //ong ca so va cham dt chng trnh
end;

end.
